package Composite;


import Visitables.Visiteur;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class Photo extends Element {
    
    
    public Photo(Element pere, File courant,String nom) {
        
        super(pere, courant, nom);
        this.setType("Photo");
    }

        public ImageIcon getRepresentation() {

        return this.png;
    }

           public boolean estUnePhoto(){
        
        return true;
    }
           
    public Photo getCopie() {
        
        Photo nouveau = new Photo(this.getPere(), this.getFichierCourant(), this.toString());
        
        return nouveau;
    }
    
        
        protected Element recupererFichierRecursive(String path,Element retour){

         if(this.getFichierCourant()!=null && path.equals(this.getFichierCourant().getPath())){
            
            retour=this;
            
        }
         return retour;
        }


    public void accept(Visiteur v) {
        
        v.visitePhoto(this);
    }

    public boolean allowsChildren() {
        return false;
    }
      
    public Image getVignette() {
        
        File vignettef = new File("vignettes/" + this.getFichierCourant().hashCode());
        if (!vignettef.exists()) return null;
        else {
            BufferedImage vignette=null;
            try {
                
               vignette = ImageIO.read(vignettef);
                
            } catch (Exception ex) {
                System.out.println("Erreur lecture vignette");
            }
            
            return vignette;
        }
    }
    
    public Image getImage() {
        
        BufferedImage image = null;
        try {
            image = ImageIO.read(this.getFichierCourant());
        } catch (IOException ex) {
          System.out.println("Erreur lecture image");
        }
        
        return image;
        
    }
    
    public void creerVignette(int xApercu, int yApercu) {
        
        
        File vignettef = new File("vignettes/" + this.getFichierCourant().hashCode());
        if (!vignettef.exists()) {
            
            
            BufferedImage vignetteTemp;
            BufferedImage image = null;
            try {
                image = ImageIO.read(this.getFichierCourant());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            
            
            // resize qui garde les proportions
            int longueurImage = image.getWidth();
            int largeurImage = image.getHeight();
            if (longueurImage >= largeurImage) {
                vignetteTemp = getScaledImage(image, xApercu, largeurImage * xApercu / longueurImage);
            } else {
                vignetteTemp = getScaledImage(image, longueurImage * yApercu / largeurImage, yApercu);
            }
            File dest = new File("vignettes/" + this.getFichierCourant().hashCode());
            try {
                
                ImageIO.write(vignetteTemp, "JPEG", dest);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            Image vignette = vignetteTemp;
            
            
        }
        
    }
    
    private BufferedImage getScaledImage(BufferedImage srcImg, int w, int h) {
        BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = resizedImg.createGraphics();
        
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        
        g2.drawImage(srcImg, 0, 0, w, h, null);
        g2.dispose();
        
        return resizedImg;
    }
    


}
